﻿using System;

namespace framework
{
    /// <summary>
    /// Área do Excel a ser pesquisada
    /// </summary>
    [Serializable]
    public class Intervalo
    {

        private string _aba;
        /// <summary>
        /// Nome da Aba
        /// </summary>
        public string aba
        {
            get { return _aba; }
            set { _aba = value; }
        }

        private Cell _inicio;
        /// <summary>
        /// Célula onde inicia o intervalo<br/>
        /// <b>OBS: Se não for definida pega toda a Aba</b>
        /// </summary>
        public Cell inicio
        {
            get { return _inicio; }
            set { _inicio = value; }
        }

        private Cell _fim;
        /// <summary>
        /// Célula onde termina o intervalo<br/>
        /// <b>OBS: Se não for definida pega toda a Aba</b>
        /// </summary>
        public Cell fim
        {
            get { return _fim; }
            set { _fim = value; }
        }

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="aba">Nome da Aba da planilha</param>
        public Intervalo(string aba)
        {
            _aba = aba;
            _inicio = new Cell("A", 1); //Inicia na célula A1
            _fim = new Cell("Z"); //Vai até a útima linha preenchida da coluna Z
        }

        /// <returns>Plan1$A1:Z</returns>
        public override string ToString()
        {
            return String.Concat(aba, "$", inicio, ":", fim);
        }
    }

    /// <summary>
    /// Céluna do Excel
    /// </summary>
    [Serializable]
    public class Cell
    {
        /// <summary>
        /// Coluna da Célula
        /// </summary>
        public string coluna { get; set; }
        /// <summary>
        /// Linha da Célula
        /// </summary>
        public Nullable<int> linha { get; set; }

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="coluna">Letra da coluna</param>
        /// <param name="linha">Número da linha</param>
        public Cell(string coluna, Nullable<int> linha = null)
        {
            this.coluna = coluna;
            this.linha = linha;
        }

        /// <returns>[collumn][roll]</returns>
        public override string ToString()
        {
            return
                linha.HasValue?
                String.Concat(coluna, linha.Value):
                coluna
            ;
        }

        /// <summary>
        /// Converte a coluna para uma Célula
        /// </summary>
        /// <param name="coluna">Letra da coluna</param>
        /// <returns>Célula da coluna</returns>
        public static implicit operator Cell(string coluna)
        {
            return new Cell(coluna);
        }
    }
}
